package com.vcoud.mundialbrasil2014;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.TimeZone;

import android.content.Intent;
import android.content.res.TypedArray;
import android.database.Cursor;
import android.database.SQLException;
import android.os.AsyncTask;
import android.os.AsyncTask.Status;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnKeyListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

import com.vcoud.mbrasil2014.R;
import com.vcoud.mundialbrasil2014.adapter.HomeAdapter;
import com.vcoud.mundialbrasil2014.adapter.PrincipalListAdapter;
import com.vcoud.mundialbrasil2014.model.PrincipalItem;

public class HomeFragment extends Fragment {
	private ArrayList<PrincipalItem> PrincipalItems;
	private PrincipalListAdapter adapter;
	private TypedArray principalIcons;
	public static final String KEY_TITULO_PRINCIPAL = "Mundial Brasil 2014";

	static final String KEY_PARTIDO_IDPARTIDO = "IDPartido";
	static final String KEY_PARTIDO_FK_EQUIPOLOCAL = "FK_EquipoLocal";
	static final String KEY_PARTIDO_FK_EQUIPOVISITANTE = "FK_EquipoVisitante";
	static final String KEY_PARTIDO_FK_EQUIPOLOCAL_NOMBRE = "FK_EquipoLocal_Nombre";
	static final String KEY_PARTIDO_FK_EQUIPOLOCAL_BANDERA = "FK_EquipoLocal_Bandera";
	static final String KEY_PARTIDO_FK_EQUIPOVISITANTE_NOMBRE = "FK_EquipoVisitante_Nombre";
	static final String KEY_PARTIDO_FK_EQUIPOVISITANTE_BANDERA = "FK_EquipoVisitante_Bandera";
	static final String KEY_PARTIDO_FK_SEDE = "FK_Sede";
	static final String KEY_PARTIDO_FECHA = "Fecha";
	static final String KEY_PARTIDO_NOMBREARBITRO = "NombreArbitro";
	static final String KEY_PARTIDO_GOLLOCAL = "GolLocal";
	static final String KEY_PARTIDO_GOLVISITANTE = "GolVisitante";
	static final String KEY_PARTIDO_GOLLOCALTIEMPOEXTRA = "GolLocalTiempoExtra";
	static final String KEY_PARTIDO_GOLVISITANTETIEMPOEXTRA = "GolVisitanteTiempoExtra";
	static final String KEY_PARTIDO_GOLLOCALPENAL = "GolLocalPenal";
	static final String KEY_PARTIDO_GOLVISITANTEPENAL = "GolVisitantePenal";
	static final String KEY_PARTIDO_FK_ETAPAMUNDIAL = "FK_EtapaMundial";

	ArrayList<HashMap<String, String>> lista;

	ActualizacionService actualizacion;
	ActualizarSegundoPlano actualizar = new ActualizarSegundoPlano();
	Boolean actualizacionFinalizada = true;
	HomeAdapter adapterPartidos;
	Boolean pausado = false;

	public HomeFragment() {
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		actualizacion = new ActualizacionService(getActivity());
		setHasOptionsMenu(true);
		crearLista();
	}

	private void crearLista() {
		try {
			lista = new ArrayList<HashMap<String, String>>();
			DB db = new DB(getActivity());
			db.abrir();
			SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd",
					Locale.US);
			String currentDate = formato.format(new Date());
			Cursor mCursor = db.obtenerPartidosPorFecha(currentDate);

			if (mCursor != null && mCursor.getCount() > 0 && mCursor.moveToFirst()) {
				do {
					HashMap<String, String> mGrupo = new HashMap<String, String>();
					try {

						String horaInicial = mCursor.getString(4);
						String mFechaCompletaString = mCursor.getString(13);
						SimpleDateFormat formatoInicial = new SimpleDateFormat(
								"HH:mm:ss", Locale.US);
						Date mHora = formatoInicial.parse(horaInicial);
						SimpleDateFormat formatoFinal = new SimpleDateFormat(
								"HH:mm", Locale.US);
						String horaFinal = formatoFinal.format(mHora);
						SimpleDateFormat formatoFecha = new SimpleDateFormat(
								"yyyy-MM-dd HH:mm:ss", Locale.US);
						formatoFecha.setTimeZone(TimeZone.getDefault());
						Date mFechaCompleta = formatoFecha
								.parse(mFechaCompletaString);
						Date mFechaHoy = formatoFecha.parse(formatoFecha
								.format(new Date()));
						String mNombreEquipoLocal = null;
						String mNombreEquipoVisitante = null;
						String mBanderaEquipoLocal = null;
						String mBanderaEquipoVisitante = null;
						Cursor equipoLocal = db.obtenerEquipo(mCursor
								.getLong(1));
						Cursor equipoVisitante = db.obtenerEquipo(mCursor
								.getLong(2));
						int mGolesLocal = mCursor.getInt(6) + mCursor.getInt(8);
						int mGolesVisitante = mCursor.getInt(7)
								+ mCursor.getInt(9);
						String mResultado = String.valueOf(mGolesLocal)
								+ this.getString(R.string.separador_goles)
								+ String.valueOf(mGolesVisitante);
						if (mFechaHoy.after(mFechaCompleta)) {
							if (mCursor.getInt(10) > 0 || mCursor.getInt(11) > 0){
								horaFinal = mResultado + "(p." + mCursor.getInt(10)
										+ "-" + mCursor.getInt(11) + ")";
							}
							else {
								horaFinal = mResultado;
							}
						}
						mNombreEquipoLocal = equipoLocal.getString(1);
						mBanderaEquipoLocal = equipoLocal.getString(2);
						mNombreEquipoVisitante = equipoVisitante.getString(1);
						mBanderaEquipoVisitante = equipoVisitante.getString(2);
						mGrupo.put(KEY_PARTIDO_IDPARTIDO, mCursor.getString(0));
						mGrupo.put(KEY_PARTIDO_FK_EQUIPOLOCAL_NOMBRE,
								mNombreEquipoLocal);
						mGrupo.put(KEY_PARTIDO_FK_EQUIPOLOCAL_BANDERA,
								mBanderaEquipoLocal);
						mGrupo.put(KEY_PARTIDO_FK_EQUIPOVISITANTE_NOMBRE,
								mNombreEquipoVisitante);
						mGrupo.put(KEY_PARTIDO_FK_EQUIPOVISITANTE_BANDERA,
								mBanderaEquipoVisitante);
						mGrupo.put(KEY_PARTIDO_FK_SEDE, mCursor.getString(3));
						mGrupo.put(KEY_PARTIDO_FECHA, horaFinal);
						mGrupo.put(KEY_PARTIDO_NOMBREARBITRO,
								mCursor.getString(5));
						mGrupo.put(KEY_PARTIDO_GOLLOCAL, mCursor.getString(6));
						mGrupo.put(KEY_PARTIDO_GOLVISITANTE,
								mCursor.getString(7));
						mGrupo.put(KEY_PARTIDO_GOLLOCALTIEMPOEXTRA,
								mCursor.getString(8));
						mGrupo.put(KEY_PARTIDO_GOLVISITANTETIEMPOEXTRA,
								mCursor.getString(9));
						mGrupo.put(KEY_PARTIDO_GOLLOCALPENAL,
								mCursor.getString(10));
						mGrupo.put(KEY_PARTIDO_GOLVISITANTEPENAL,
								mCursor.getString(11));
						mGrupo.put(KEY_PARTIDO_FK_ETAPAMUNDIAL,
								mCursor.getString(12));
						equipoLocal.close();
						equipoVisitante.close();
					} catch (SQLException e) {
						e.printStackTrace();
					} catch (java.text.ParseException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					lista.add(mGrupo);
				} while (mCursor.moveToNext());
			} else {
				HashMap<String, String> mGrupo = new HashMap<String, String>();
				mGrupo.put(KEY_PARTIDO_IDPARTIDO, "0");
				mGrupo.put(KEY_PARTIDO_FK_EQUIPOLOCAL_NOMBRE, "");
				mGrupo.put(KEY_PARTIDO_FK_EQUIPOLOCAL_BANDERA, "");
				mGrupo.put(KEY_PARTIDO_FK_EQUIPOVISITANTE_NOMBRE, "");
				mGrupo.put(KEY_PARTIDO_FK_EQUIPOVISITANTE_BANDERA, "");
				mGrupo.put(KEY_PARTIDO_FECHA,
						getActivity().getString(R.string.sin_partidos));
				lista.add(mGrupo);
			}
			mCursor.close();
			db.cerrar();
		} catch (SQLException e) {

			e.printStackTrace();
		}
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {

		switch (item.getItemId()) {
		case R.id.action_refresh:
			actualizar = new ActualizarSegundoPlano();
			actualizar.execute();
			return true;
		default:
			return super.onOptionsItemSelected(item);
		}
	}

	@Override
	public void onPrepareOptionsMenu(Menu menu) {
		menu.findItem(R.id.action_refresh).setVisible(actualizacionFinalizada);
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		getActivity().setTitle(KEY_TITULO_PRINCIPAL);
		principalIcons = getResources().obtainTypedArray(
				R.array.principal_items_backgrounds);
		final View rootView = inflater.inflate(R.layout.fragment_home,
				container, false);
		ListView listaPartidos = (ListView) rootView
				.findViewById(R.id.lista_partidos);
		adapterPartidos = new HomeAdapter(super.getActivity(), lista);
		listaPartidos.setAdapter(adapterPartidos);

		listaPartidos.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				Fragment fragment = null;
				fragment = new DetallePartidoFragment();
				if (fragment != null) {
					// Permite pasar los argumentos a DetallePartido
					Bundle args = new Bundle();
					id = adapterPartidos.getItemId(position);
					args.putLong("IDPartido", id);
					fragment.setArguments(args);
					FragmentManager fragmentManager = getFragmentManager();
					fragmentManager
							.beginTransaction()
							.replace(R.id.frame_container, fragment,
									"detalle_partido").addToBackStack(getTag())
							.commit();
				}
			}
		});
		rootView.setFocusableInTouchMode(true);
		rootView.requestFocus();
		rootView.setOnKeyListener(new OnKeyListener() {
			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				if (keyCode == KeyEvent.KEYCODE_BACK) {
					System.exit(0);
					return true;
				}
				return false;
			}

		});

		// Time TimerSet = new Time();
		// TimerSet.switchTimezone("America/Caracas");
		// TimerSet.set(0, 30, 15, 12, 5, 2014); // day month year
		// long millis = TimerSet.toMillis(true);
		//
		// Time TimeNow = new Time();
		// TimeNow.switchTimezone("America/Caracas");
		// TimeNow.setToNow(); // set the date to Current Time
		//
		// long millis2 = TimeNow.toMillis(true);
		//
		// long millisset = millis - millis2; // subtract current from future to
		// // set the time remaining
		//
		// // final int smillis = (int) (millis); //convert long to integer to
		// // display conversion results
		// // final int smillis2 = (int) (millis2);
		//
		// new CountDownTimer(millisset, 1000) {
		// @Override
		// public void onTick(long millisUntilFinished) {
		//
		// // decompose difference into days, hours, minutes and seconds
		// // int weeks = (int) ((millisUntilFinished / 1000) / 604800);
		// int days = (int) ((millisUntilFinished / 1000) / 86400);
		// int hours = (int) (((millisUntilFinished / 1000) - (days * 86400)) /
		// 3600);
		// int minutes = (int) (((millisUntilFinished / 1000) - ((days * 86400)
		// + (hours * 3600))) / 60);
		// // int seconds = (int) ((millisUntilFinished / 1000) % 60);
		// // int millicn = (int) (millisUntilFinished / 1000);
		//
		// if (days < 10) {
		// TextView d = (TextView) rootView.findViewById(R.id.dias);
		// d.setText("0" + days);
		// } else {
		// TextView d = (TextView) rootView.findViewById(R.id.dias);
		// d.setText("" + days);
		// }
		// if (hours < 10) {
		// TextView h = (TextView) rootView.findViewById(R.id.horas);
		// h.setText("0" + hours);
		// } else {
		// TextView h = (TextView) rootView.findViewById(R.id.horas);
		// h.setText("" + hours);
		// }
		//
		// if (minutes < 10) {
		// TextView m = (TextView) rootView.findViewById(R.id.minutos);
		// m.setText("0" + minutes);
		// } else {
		// TextView m = (TextView) rootView.findViewById(R.id.minutos);
		// m.setText("" + minutes);
		// }
		//
		// }
		//
		// @Override
		// public void onFinish() {
		// }
		// }.start();

		final String[] navMenuTitles = getActivity().getResources()
				.getStringArray(R.array.home_items);

		PrincipalItems = new ArrayList<PrincipalItem>();

		// adding nav drawer items to array
		// Home
		PrincipalItems.add(new PrincipalItem(navMenuTitles[0], principalIcons
				.getResourceId(0, -1)));
		// Find People
		PrincipalItems.add(new PrincipalItem(navMenuTitles[1], principalIcons
				.getResourceId(1, -1)));
		// Photos
		PrincipalItems.add(new PrincipalItem(navMenuTitles[2], principalIcons
				.getResourceId(2, -1)));
		PrincipalItems.add(new PrincipalItem(navMenuTitles[3], principalIcons
				.getResourceId(3, -1)));
		PrincipalItems.add(new PrincipalItem(navMenuTitles[4], principalIcons
				.getResourceId(4, -1)));

		final ListView listview = (ListView) rootView
				.findViewById(R.id.listView1);
		// Defined Array values to show in ListView
		/*
		 * String[] values = new String[] { "Equipos", "Grupos", "Partidos" };
		 */

		// Define a new Adapter
		// First parameter - Context
		// Second parameter - Layout for the row
		// Third parameter - ID of the TextView to which the data is written
		// Forth - the Array of data

		adapter = new PrincipalListAdapter(getActivity(), PrincipalItems);

		// Assign adapter to ListView
		listview.setAdapter(adapter);
		// ListView Item Click Listener
		listview.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {

				// ListView Clicked item index
				int itemPosition = position;
				String tag = null;
				Fragment fragment = null;
				switch (itemPosition) {
				case 0:
					fragment = new EquipoFragment();
					tag = "fragment_equipo";
					break;
				case 1:
					fragment = new GrupoFragment();
					tag = "fragment_grupo";
					break;
				case 2:
					Intent intent = new Intent(getActivity(),
							PartidoActivity.class);
					intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
					startActivity(intent);
					break;
				case 3:
					fragment = new JugadorFragment();
					tag = "fragment_jugador";
					break;
				case 4:
					fragment = new EstadisticasFragment();
					tag = "fragment_estadisticas";
					break;

				default:
					break;
				}
				if (fragment != null) {
					FragmentManager fragmentManager = getFragmentManager();
					fragmentManager.beginTransaction()
							.replace(R.id.frame_container, fragment, tag)
							.addToBackStack(null).commit();

					// update selected item and title, then close the drawer
					listview.setItemChecked(position, true);
					getActivity().getActionBar().setTitle(
							navMenuTitles[position]);

				} else {
					// error in creating fragment
					Log.e("MainActivity", "Error creando el fragment");
				}
			}

		});

		principalIcons.recycle();

		return rootView;
	}

	@Override
	public void onPause() {
		super.onPause();
		pausado = true;
		getActivity().setProgressBarIndeterminateVisibility(false);
		if (actualizar.getStatus() == Status.RUNNING) {
			actualizar.cancel(true);
		}

	}

	@Override
	public void onResume() {
		super.onResume();
		actualizacionFinalizada = true;
		getActivity().invalidateOptionsMenu();
		if (pausado) {
			pausado = false;
			actualizar = new ActualizarSegundoPlano(1);
			actualizar.execute();
		}
	}

	private class ActualizarSegundoPlano extends
			AsyncTask<String, Void, Boolean> {
		int tipo;

		public ActualizarSegundoPlano(int... tipo) {
			if (tipo.length == 0) {
				this.tipo = 0;
			} else {
				this.tipo = tipo[0];
			}
		}

		@Override
		protected void onPreExecute() {
			if (tipo == 0) {
				getActivity().setProgressBarIndeterminateVisibility(true);
				actualizacionFinalizada = false;
				getActivity().invalidateOptionsMenu();
			}
		}

		@Override
		protected Boolean doInBackground(String... equipos) {
			return actualizacion.actualizarPartidosHoy();
		}

		@Override
		protected void onPostExecute(Boolean result) {
			if (result) {
				crearLista();
				adapterPartidos.actualizar(lista);
				// final FragmentTransaction ft = getActivity()
				// .getSupportFragmentManager().beginTransaction();
				// Fragment fr = null;
				// fr = getActivity().getSupportFragmentManager()
				// .findFragmentByTag("fragment_home");
				// ft.detach(fr).attach(fr).commit();
				if (tipo == 0) {
					actualizacionFinalizada = true;
					getActivity().invalidateOptionsMenu();
					getActivity().setProgressBarIndeterminateVisibility(false);
				}
			} else {
				if (tipo == 0) {
					actualizacionFinalizada = true;
					getActivity().invalidateOptionsMenu();
					getActivity().setProgressBarIndeterminateVisibility(false);
				}
			}
		}
	}

}
